/**
 * 小葱的01串
 *
 * 题目描述
 * 给定一个长度为偶数的环形 01 字符串。（环形指，第一个字符和最后一个字符是相邻的）
 * 字符串初始每个字符都是白色。小葱想把一段连续区间染成红色，使得红色的字符'0'数量等
 * 于白色的字符'0'数量，红色的字符'1'数量等于白色的字符'1'数量。问有多少种不同的染色方法？
 * 两个方案不同当且仅当存在一个某字符，在一个方案是染成红色，在另一个方案为白色。
 *
 * 输入描述:
 * 第一行输入一个正整数n，代表字符串长度。
 * 第二行输入一个长度为n 的 01 字符串（仅由字符'0'和字符'1'组成的字符串）
 *
 * 数据范围：
 * 2≤n≤300000 。保证 n 是偶数。
 *
 * 输出描述:
 * 合法的染色方案数。
 */

import java.util.Scanner;

/**
 * 方法 1 :
 * 我们先记录下 字符'0' 和字符 '1'出现的个数, 然后再枚举 i ~ j 中
 * 出现的 '0', '1' 个数, 要是相同就可以涂鸦了, 怎么来顺利枚举呢,
 * 我们可以借助 dp 来, dp[i] : 表示 0~i 出现了几个 '0', 这样
 * dp[i] - dp[j - 1], 就可以知道所要求的区间中的 '0' 的个数了
 * '1' 也同样如此, 但是这里有一个魔鬼细节, 就是 给的这个字符串是
 * 首位相连的, 那么我们一旦枚举成功一个, 那就说明还有一个等着我们,
 * 那我们就要 res += 2, 但是我们会发现还有一种特殊情况, 就是我们
 * 可能会枚举到前面一半和后面一半的情况, 这个时候我们在前面一半就已经
 * += 2, 要是我们在后面一半也 += 2, 那么就会出现问题, 所以我们要杜绝
 * 最后一个会被枚举到的可能性, 那我们进行枚举遍历的时候, 只要遍历到 最后
 * 一个字符前就可以了
 * 这个方法会超时
 * 时间复杂度 : O(n ^ 2)
 * 空间复杂度 : O(n)
 *
 *
 * 方法 2 :
 * 使用滑动窗口
 * 这里比前面的时间复杂度小了一轮
 * 时间复杂度 : O(n)
 * 空间复杂度 : O(1)
 */

public class Main {

    // *************************************************************************
    // 方法 2
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);

        int n = in.nextInt();
        char[] nums = in.next().toCharArray();

        // 记录 0 和 1 的个数
        int char0 = 0, char1 = 0;
        int res = 0;
        for (int i = 0; i < n; i++) {
            if (nums[i] == '0') {
                char0++;
            } else {
                char1++;
            }
        }

        // 边界
        int left = 0, right = 0;

        // 分别记录 0 和 1 的个数
        int x1 = 0, x2  =0;

        // 依旧魔鬼细节不要忘记
        while (right < n - 1) {

            // 入窗口
            if (nums[right] == '0') {
                x1++;
            } else {
                x2++;
            }

            // 第一步需要满足的条件
            if (right - left + 1 == n / 2) {

                // 判断是否满足更新条件
                if (x1 + x1 == char0 && x2 + x2 == char1) {

                    // 每一种可能 + 2
                    res += 2;
                }

                // 出窗口
                if (nums[left++] == '0') {
                    x1--;
                } else {
                    x2--;
                }
            }

            right++;
        }
        System.out.println(res);
    }

    // *************************************************************************
    // 方法 1 (会超时)
    public static void main1(String[] args) {
        Scanner in = new Scanner(System.in);

        int n = in.nextInt();
        char[] nums = in.next().toCharArray();

        // 记录 0 和 1 的个数
        int char0 = 0, char1 = 0;
        int res = 0;

        // 0 ~ i : 有多少个 '0'
        int[] dp1 = new int[n + 1];

        // 0 ~ i : 有多少个 '1'
        int[] dp2 = new int[n + 1];

        // 记录
        for (int i = 1; i <= n; i++) {
            dp1[i] = dp1[i - 1];
            dp2[i] = dp2[i - 1];
            if (nums[i - 1] == '0') {
                char0++;
                dp1[i]++;
            } else {
                char1++;
                dp2[i]++;
            }

        }

        // 魔鬼细节, 遍历到最后一个字符串的前面就可以了
        // 枚举每一种可能得组合
        for (int i = 1; i < n; i++) {
            for (int j = 1; j <= i; j++) {

                // 0
                int x1 = dp1[i] - dp1[j - 1];

                // 1
                int x2 = dp2[i] - dp2[j - 1];

                if (x1 + x1 == char0 && x2 + x2 == char1) {

                    // 每一种可能 + 2
                    res += 2;
                }
            }
        }

        // 打印结果
        System.out.println(res);
    }
}
